package com.gdust.lease.web.admin.custom.config;

import com.gdust.lease.web.admin.custom.converter.StringToBaseEnumConverterFactory;
import com.gdust.lease.web.admin.custom.interceptor.AuthenticationInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * ClassName: WebMvcConfiguration
 * Package: com.gdust.lease.web.admin.custom.config
 * Description: Spring MVC 配置类
 *
 *  1. 注册自定义的字符串转换为枚举的工厂类，使 Spring MVC 能够自动转换请求参数为枚举类型。
 *  2. 配置拦截器，对 `/admin/**` 路径下的请求进行拦截，确保访问受限资源时需要身份验证。
 * @Author syun
 * @Create 2025/1/1 22:42
 * @Version 1.0
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {
    // 注入自定义的枚举类型转换工厂，用于将字符串转换为枚举类型
    @Autowired
    private StringToBaseEnumConverterFactory stringToBaseEnumConverterFactory;

    //注入认证拦截器
    @Autowired
    private AuthenticationInterceptor authenticationInterceptor;

    /**
     * 添加自定义格式化器或转换器
     *
     * @param registry FormatterRegistry 注册表，用于添加格式化器或转换器
     */
    @Override
    public void addFormatters(FormatterRegistry registry) {
        // 将自定义的枚举类型转换工厂注册到 Spring 的格式化器注册表中
        registry.addConverterFactory(this.stringToBaseEnumConverterFactory);
    }

    /**
     * 配置拦截器，限制访问权限
     *
     * @param registry InterceptorRegistry 对象，用于注册拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(this.authenticationInterceptor)
                .addPathPatterns("/admin/**") // 只拦截 `/admin/**` 路径下的请求
                .excludePathPatterns("/admin/login/**"); // 但排除 `/admin/login/**`，避免拦截登录请求
    }
}
